//
// Created by 10741 on 2021/4/29.
//

#ifndef CATALOGTREE_CATALOGTREE_H
#define CATALOGTREE_CATALOGTREE_H

#include <sstream>
#include "file.h"
using namespace std;


class catalogTree{
public:
    catalogTree();

    ~catalogTree();

    /* 操作外壳 */
    void shell();
private:
    /* 根目录 */
    file root;

    /* 当前所在目录的指针 */
    file *cur{};

    /* 列出当前目录下的子目录和文件 */
    void dir(stringstream &in);

    /* 寻找指定路径的文件，返回目标文件的指针 */
    file *findPath(string &path);

    /* 显示当前目录的绝对路径, 或更改路径 */
    void cd(stringstream &in);

    /* 创建目录 */
    void mkdir(stringstream &in);

    /* 创建文件 */
    void mkfile(stringstream &in);

    /* 删除文件或目录 */
    void remove(stringstream &in);

    /* 保存文件树结构 */
    void save(stringstream &in);

    /* 从文件中读取文件结构 */
    void load(stringstream &in);

    /* 将文件移动或复制到另一个路径 */
    void _move(stringstream &in);

    /* 检查文件名是否包含非法字符 */
    static bool validName(const string &s);

    /* 分离出末尾的文件名和前面的路径 */
    static string split(string &s);

    /* 画出当前目录或指定目录下的文件树 */
    void tree(stringstream &in);
};


#endif //CATALOGTREE_CATALOGTREE_H
